July 23, 2021
const sum = (arr, i=0, acc=0) {
if (arr.length === i) return acc;
return sum(arr, acc+arr[i], i+1);
};
변수의 스코프는 일반적으로 권한 관련된 얘기, 라이프사이클은 메모리의 점유
‘스코프만큼 살아있는게 아닌가?’ 아니다.
연산과 메모리는 trade off.
같은 스코프라도 라이프사이클을 길게 가져갈 수 있다.
이점은? 연산을 덜 할 수 있다.
const _sum = (arr, i, acc) { // 초기값을 0으로 안넣어줘도 된다.
if (arr.length === i) return acc;
return _sum(arr, acc+arr[i], i+1);
};
const sum = (arr) => _sum(arr, 0, 0);
이렇게 하면 초기값을 안넣어줘도 되는 이점이 있다. 하지만 sum에서만 _sum에 접근 가능하도록 만들고 싶다.
수정
let sum;
{
const _sum = (arr, i, acc) => {
if (arr.length === i) return acc;
return _sum(arr, arr+arr[i], i+1);
};
sum = arr => _sum(arr, 0 0);
}
}
이렇게 하면 _sum은 전역에서 접근할 수 없다. 하지만 let이라는 단점이 있다.
수정
const arraySum = (() => {
const elementSum = (arr, i, acc) => {
if (arr.length === i) return acc;
return elementSum(arr, acc + arr[i], i + 1);
};
return elementSum(arr, 0, 0);
})();
// 1번 코드
//elementSum
//scope : arraySum만 알게 했다. lifecycle : arraySum호출할 때 생성되어 리턴시 제거
const arraySum = (() => {
const elementSum = (arr, i, acc) => {
if (arr.length === i) return acc;
return elementSum(arr, acc + arr[i], i + 1);
};
const arraySum = arr => elementSum(arr, 0, 0);
return arraySum;
})();
// 2번 코드
// elementSum
// scope : arraySum만 알게 했다. lifecycle : 영구적
const로 수정했다. 변수명도 알맞게 바꿔줬다.
1번 코드는 라이프사이클이 짧다. 호출할 때마다 elementSum을 불러야해서 연산이 느리지만 메모리는 상시점유하지 않는다.
2번 코드는 라이프사이클을 길게 가져가서 연산성능을 중시한 것.
정답은 없다. 상황에 맞게 선택.